﻿using System;

namespace Central.Linq {

	/// <summary>
	/// Параметры для формирования запроса к данным<para/>
	/// </summary>
	[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly")]
	public sealed class QueryParams {
		#region конструкторы

		/// <summary>
		/// конструктор
		/// </summary>
		/// <param name="fieldManager">коллекция полей</param>
		public QueryParams(FieldManager fieldManager) {
			if (fieldManager == null) throw new ArgumentNullException("fieldManager");
			this.Fields = fieldManager;
		}

		/// <summary>
		/// конструктор
		/// </summary>
		/// <param name="fieldManager">коллекция полей</param>
		/// <param name="filters">коллекция фильтров</param>
		/// <param name="sorters">коллекция сортировки</param>
		public QueryParams(FieldManager fieldManager, FilterManager filters, SortManager sorters)
			: this(fieldManager) {
			if (filters == null) throw new ArgumentNullException("filters");
			if (sorters == null) throw new ArgumentNullException("sorters");
			this.Filters = filters;
			this.Sorters = sorters;
		}

		/// <summary>
		/// конструктор
		/// </summary>
		/// <param name="fieldManager">коллекция полей</param>
		/// <param name="filters">коллекция фильтров</param>
		/// <param name="sorters">коллекция сортировки</param>
		/// <param name="groups">коллекция группировки</param>
		public QueryParams(FieldManager fieldManager, FilterManager filters, SortManager sorters, GroupManager groups)
			: this(fieldManager, filters, sorters) {
			if (groups == null) throw new ArgumentNullException("groups");
			this.Groups = groups;
		}

		#endregion конструкторы

		private FilterManager filters;

		/// <summary>
		/// Коллекция параметров для фильтрации
		/// </summary>
		public FilterManager Filters {
			get {
				if (filters == null)
					filters = new FilterManager();
				return filters;
			}
			set {
				filters = value;
			}
		}

		private SortManager sorters;

		/// <summary>
		/// Коллекция параметров для сортировки
		/// </summary>
		public SortManager Sorters {
			get {
				if (sorters == null)
					sorters = new SortManager();
				return sorters;
			}
			set {
				sorters = value;
			}
		}

		private GroupManager groups;

		/// <summary>
		/// Коллекция параметров для группировки
		/// </summary>
		public GroupManager Groups {
			get {
				if (groups == null)
					groups = new GroupManager();
				return groups;
			}
			set {
				groups = value;
			}
		}

		/// <summary>
		/// Коллекция свойств возвращаемого результата
		/// </summary>
		public FieldManager Fields { get; private set; }
	}
}